<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  链表和节点
  <script>
    // 节点，只有这两个属性
    class Node {
      constructor(val) {
        this.val = val
        this.next = null
      }
    }
    // 链表 链表的操作（增删改查）
    // 会有很多其他的方法
    class linkNodeList {
      constructor() {
        // 头节点
        this.head = null
        // 长度
        this.length = 0
      }
      // 增删改查
      append(val) {
        const node = new Node(val)
        let cur
        if(this.head === null) {
          // 链表为空
          this.head = node
        }else{
          // 链表不是空的，找到最后一个
          cur = this.head
          while(cur.next) {
            cur = cur.next
          }
          cur.next = node
        }
        // 修改length
        this.length += 1
      }
      // 删除第index项
      removeAt(index) {
        if(index >= this.length) return
        // 上一个元素
        let pre
        // 当前元素
        let cur = this.head
        let i=0
        if(index === 0) {
          console.log(cur);
          this.head = cur.next
        }else{
          while(i<index) {
            pre = cur
            cur = cur.next
            i++
          }
          pre.next = cur.next
          // 释放内存
          cur.next = null
        }
        // 删除后length-1
        this.length -= 1
      }
      // 删除值为 val 的项
      /*
        all 是否找到所有的，并进行删除
        TODO 删除有问题
      */
      removeItem(val, all=false) {
        if(this.length === 0) return null
        let pre
        let cur = this.head
        // 判断是否是第一个
        // TODO 有问题，当第一个就是重复n次的时候
        // if(this.head.val === val) {
        //   this.head = cur.next
        //   this.length -= 1
        //     return
        // }
        if(this.head.val === val) {
            while(cur && cur.val === val) {
                this.head = cur.next
                cur = this.head
            }
            if(!this.head || this.head.next === null) {
                return this.head
            }
        }
        // 不是第一个，正常递归
        while(cur) {
          // console.log(cur, all);
          pre = cur
          cur = cur.next
          console.log('===pre', pre)
          console.log('===cur',  cur)
          // 只有cur存在的时候，才会判断
          if(cur && cur.val === val) {
            console.log('in if ', cur.val, cur.next)
            pre.next = cur.next
            // 错误的条件，修改后cur应该还是pre才对
            // cur = cur.next
            cur = pre
            this.length -= 1
            if(!all) {
              return
            }
          }
        }
      }
      print() {
        let arr = []
        if(this.length) {
          let cur = this.head
          while(cur) {
            console.log(cur)
            arr.push(cur.val)
            cur = cur.next
          }
          console.log(arr.join('===>'));
        }
      }
    }
    const linknodelist = new linkNodeList()
    linknodelist.append('a')
    linknodelist.append('a')
    linknodelist.append('a')
    linknodelist.append('a')
    linknodelist.append('e')
    linknodelist.append('b')
    linknodelist.append('c')
    linknodelist.append('d')
    linknodelist.append('e')
    linknodelist.append('e')
    linknodelist.append('e')
    // linknodelist.removeAt(20)
    // linknodelist.removeItem('a')
    // linknodelist.removeItem('e')
    // linknodelist.removeItem('e', true)
    linknodelist.removeItem('a', true)
    linknodelist.print()
  </script>
</body>
</html>